﻿using System.Drawing;

namespace Kyoh.Lib.Excel
{
    /// <summary>Visual Basic 6.0以前の 色を表す構造体。</summary>
    /// <seealso cref="Color"/>
    public struct VbColor
    {
        /// <summary>アルファ</summary>
        public byte A { get; set; }
        /// <summary>赤</summary>
        public byte R { get; set; }
        /// <summary>緑</summary>
        public byte G { get; set; }
        /// <summary>青</summary>
        public byte B { get; set; }

        /// <summary><see cref="Color"/> 構造体を元に、新しい <see cref="VbColor"/> 構造体を初期化します。</summary>
        /// <param name="color"><see cref="Color"/> 構造体。</param>
        /// <returns>指定された <see cref="Color"/> 構造体に基づく、<see cref="VbColor"/> 構造体。</returns>
        /// <seealso cref="Color"/>
        public static VbColor FromColor(Color color)
        {
            return new VbColor()
            {
                R = color.R,
                G = color.G,
                B = color.B,
            };
        }
        /// <summary><see cref="Color"/> 構造体に変換します。</summary>
        /// <returns><see cref="Color"/> 構造体。</returns>
        /// <seealso cref="Color"/>
        public Color ToColor()
        {
            return Color.FromArgb(this.A, this.R, this.G, this.B);
        }
        /// <summary>ARGBを指定して <see cref="VbColor"/> 構造体を作成します。</summary>
        /// <param name="alpha">アルファ</param>
        /// <param name="red">赤</param>
        /// <param name="green">緑</param>
        /// <param name="blue">青</param>
        /// <returns>指定されたARGBを表す <see cref="VbColor"/> 構造体。</returns>
        public static VbColor FromArgb(byte alpha, byte red, byte green, byte blue)
        {
            return new VbColor()
            {
                A = alpha,
                R = red,
                G = green,
                B = blue,
            };
        }
        /// <summary>RGBを指定して <see cref="VbColor"/> 構造体を作成します。</summary>
        /// <param name="red">赤</param>
        /// <param name="green">緑</param>
        /// <param name="blue">青</param>
        /// <returns>指定されたRGBを表す <see cref="VbColor"/> 構造体。</returns>
        public static VbColor FromRgb(byte red, byte green, byte blue)
        {
            return FromArgb(0, red, green, blue);
        }
        /// <summary><see cref="System.Int32"/> 整数値を指定して <see cref="VbColor"/> 構造体を作成します。</summary>
        /// <param name="integer">色を表す <see cref="System.Int32"/> 値。</param>
        /// <returns>指定された <see cref="System.Int32"/> 整数値を表す <see cref="VbColor"/> 構造体。</returns>
        public static VbColor FromInteger(int integer)
        {
            return FromArgb((byte)((integer >> 24) & 0xff), (byte)(integer & 0xff), (byte)((integer >> 8) & 0xff), (byte)((integer >> 16) & 0xff));
        }
        /// <summary><see cref="System.Int32"/> 整数値に変換します。</summary>
        /// <returns>このオブジェクトが表す色の <see cref="System.Int32"/> 整数値。</returns>
        public int ToInteger()
        {
            return (this.A << 24) | (this.B << 16) | (this.G << 8) | this.R;
        }

        /// <summary>自動設定の色。</summary>
        public static VbColor Automatic = VbColor.FromInteger(-4105);
        /// <summary>色指定なし。</summary>
        public static VbColor None = VbColor.FromInteger(-4142); // 色指定無し
    }
}
